package com.bjsxt.service.impl;

import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.domain.User;
import com.bjsxt.domain.UserWallet;
import com.bjsxt.mapper.UserWalletMapper;
import com.bjsxt.service.UserService;
import com.bjsxt.service.UserWalletService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserWalletServiceImpl extends ServiceImpl<UserWalletMapper, UserWallet> implements UserWalletService {
    /**
     * 用户业务层对象
     */
    @Autowired
    private UserService userService;

    /**
     * 分页查询用户的提币地址
     *
     * @param page   分页对象<UserWallet>
     * @param userId 用户 id
     * @return 提币地址分页数据
     */
    @Override
    public Page<UserWallet> pageByUserId(Page<UserWallet> page, Long userId) {
        // 根据响应的条件进行分页数据的查询并返回
        return page(page, new LambdaQueryWrapper<UserWallet>()
                .eq(UserWallet::getUserId, userId)
        );
    }

    /**
     * 根据用户 id 和币种 id 进行提币地址的查询
     *
     * @param userId 用户 id
     * @param coinId 币种 id
     * @return 提币地址集合数据
     */
    @Override
    public List<UserWallet> getByUserIdAndCoinId(Long userId, Long coinId) {
        // 构建查询条件查询并返回
        return list(new LambdaQueryWrapper<UserWallet>().eq(UserWallet::getUserId, userId).eq(UserWallet::getCoinId, coinId));
    }

    /**
     * 进行数据的保存
     *
     * @param userWallet  需要保存的数据
     * @param payPassword 用户的交易密码
     * @return true 保存成功 false 保存失败
     */
    @Override
    public boolean save(UserWallet userWallet, String payPassword) {
        // 调用业务层进行 user 数据的查询
        User user = userService.getById(userWallet.getUserId());
        // 如果查询的用户不存在
        Assert.notNull(user, "该用户不存在");
        // 判断密码是否正确
        boolean flag = BCrypt.checkpw(payPassword, user.getPaypassword());
        Assert.isTrue(flag, "用户支付密码不正确");
        // 调用方法进行数据的保存
        return save(userWallet);
    }

    /**
     * 根据用户 id 和交易密码进行删除用户提币地址
     *
     * @param id          用户 Id
     * @param payPassword 交易密码
     * @return true 删除成功 false 删除失败
     */
    @Override
    public boolean removeByIdAndPayPassword(Long id, String payPassword) {
        // 查询用户提币数据
        UserWallet userWallet = getById(id);
        // 根据 id 查询用户数据
        User user = userService.getById(userWallet.getUserId());
        // 如果查询的用户不存在
        Assert.notNull(user, "该用户不存在");
        // 校验用户的密码是否正确
        boolean flag = BCrypt.checkpw(payPassword, user.getPaypassword());
        Assert.isTrue(flag, "用户支付密码不正确");
        // 进行数据的删除
        return removeById(id);
    }
}
